package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.Asignatura;
import Dominio.AsignaturaOfertaAcademica;
import Dominio.OfertaAcademica;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DAOOfertaAcademica {
    private static final String TABLA_OFERTAS_ACADEMICAS = "ofertasAcademicas";
    private static final String COLUMNA_CLAVE_OFERTA_ACADEMICA = "claveOferta";
    private static final String COLUMNA_CLAVE_ASIGNATURA_O_A = "clave_asig_o_a";
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    private Connection conexion = null;
    
    public DAOOfertaAcademica() {
        this.conexion = acceso.abrirConexion();
    }
    
    public void cerrarConexionAOferta() {
        acceso.cerrarConexion(conexion);
    }
    
    public ArrayList<String> obtenerClavesOfertas(){
        String queryBusqueda = "SELECT DISTINCT "+COLUMNA_CLAVE_OFERTA_ACADEMICA+" FROM "+TABLA_OFERTAS_ACADEMICAS;
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.last();
            int resultSetSize = resultado.getRow();
            if(resultSetSize > 0){
                ArrayList<String> lista = new ArrayList<String>();
                resultado.first();
                while(resultado.getRow() != 0){//Mientras no se llegue a la ultima linea
                    lista.add(resultado.getString(1));
                    resultado.next();
                }
                resultado.close();
                return lista;
            }else{
                return null;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
            return null;
        }
    }
    
    public OfertaAcademica buscarOfertaAcademica(String claveOferta){
        String queryBusqueda = "SELECT "+COLUMNA_CLAVE_ASIGNATURA_O_A+" FROM "+TABLA_OFERTAS_ACADEMICAS+ " WHERE " + COLUMNA_CLAVE_OFERTA_ACADEMICA + " = '" + claveOferta + "'";
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.last();
            int resultSetSize = resultado.getRow();
            if(resultSetSize > 0){
                ArrayList<String> lista = new ArrayList<String>();
                resultado.first();
                OfertaAcademica oferta = new OfertaAcademica();
                oferta.setClaveOferta(claveOferta);
                DAOAsignaturaOfertaAcademica daoAO = new DAOAsignaturaOfertaAcademica();
                while(resultado.getRow() != 0){//Mientras no se llegue a la ultima linea
                    AsignaturaOfertaAcademica actual = daoAO.buscarAsignaturaOfertaAcademica(resultado.getInt(1));
                    oferta.addAsignatura(actual);
                    resultado.next();
                }
                resultado.close();
                return oferta;
            }else{
                return null;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
            return null;
        }
    }
    
    public ArrayList<OfertaAcademica> buscarTodasLasOfertas(){
        ArrayList<String> clavesOfertas = obtenerClavesOfertas();
        ArrayList<OfertaAcademica> ofertas = new ArrayList<OfertaAcademica>();
        if(clavesOfertas!=null){
            for(int i=0;i<clavesOfertas.size();i++){
                OfertaAcademica actual = buscarOfertaAcademica(clavesOfertas.get(i));
                ofertas.add(actual);
            }
            return ofertas;
        } else {
            return null;
        }
    }
    
    public ArrayList<Asignatura> obtenerAsignaturasDeOferta(String claveOferta){
        OfertaAcademica oferta = buscarOfertaAcademica(claveOferta);
        ArrayList<AsignaturaOfertaAcademica> asignaturasOA = oferta.getAsignaturas();
        ArrayList<Asignatura> asignaturas = new ArrayList<Asignatura>();
        DAOAsignaturaOfertaAcademica daoAO = new DAOAsignaturaOfertaAcademica();
        for(int i=0; i<asignaturasOA.size(); i++){
            AsignaturaOfertaAcademica actualAOA = asignaturasOA.get(i);
            Asignatura actual = daoAO.obtenerAsignaturaDeOferta(actualAOA.getClaveAsignatura());
            asignaturas.add(actual);
        }
        if(asignaturas.size()>0){
            return asignaturas;
        } else {
            return null;
        }
    }
    
    public void aniadirAsignaturaAOferta(String claveOferta, AsignaturaOfertaAcademica asignatura){
        try {
            DAOAsignaturaOfertaAcademica daoAO = new DAOAsignaturaOfertaAcademica();
            //daoAO.registrarAsignatura(asignatura);
            int claveAsignaturaOferta = daoAO.buscarClaveAsignaturaOfertaAcademica(asignatura);
            
            
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryInsertar = "INSERT INTO " + TABLA_OFERTAS_ACADEMICAS + " ("
                    + COLUMNA_CLAVE_OFERTA_ACADEMICA +","
                    + COLUMNA_CLAVE_ASIGNATURA_O_A
                    + ") VALUES ('"
                    +claveOferta+"',"
                    +claveAsignaturaOferta+")";
            sentencia.executeUpdate(queryInsertar);
            daoAO.cerrarConexionAAsignaturaOferta();
            
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de registrar La Asignatura a la oferta Academica");
        }
    }
    
    public void eliminarAsignaturaAOferta(String claveOferta, int claveAsignaturaOA) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String deleteQuery = "DELETE FROM " + TABLA_OFERTAS_ACADEMICAS+ " WHERE "
                    + COLUMNA_CLAVE_OFERTA_ACADEMICA + " = '" + claveOferta + "' AND "
                    + COLUMNA_CLAVE_ASIGNATURA_O_A + " = '" + claveAsignaturaOA + "'";
            sentencia.executeUpdate(deleteQuery);
            DAOAsignaturaOfertaAcademica daoAO = new DAOAsignaturaOfertaAcademica();
            daoAO.eliminarAsignatura(claveAsignaturaOA);
            daoAO.cerrarConexionAAsignaturaOferta();
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de eliminar una Asignatura de Oferta Academica");
        }
    }
    
    public String obtenerClaveDeUltimaOferta() {
        String claveUltimaOferta = "";
        
        try {
            String queryBusqueda = "SELECT "+COLUMNA_CLAVE_OFERTA_ACADEMICA+" FROM "+TABLA_OFERTAS_ACADEMICAS+ ";";       
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            
            while(resultado.next()) {
                if(resultado.isLast()) {
                    claveUltimaOferta = resultado.getString(1);
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOOfertaAcademica.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return claveUltimaOferta;
    }
    
    
}
